&НаКлиенте
Процедура ЗаписатьИЗакрыть(Команда)
	Если Не Параметры.Переименовать Тогда
		ИзменитьПараметр();
		Оповестить("ИзменилсяПараметр");
	КонецЕсли;
	Закрыть();
КонецПроцедуры

&НаКлиенте
Процедура УстановитьНаименованиеПараметра(Команда)
	НаименованиеПараметра=СокрЛП(НаименованиеПараметра);
	Если ЕстьОшибкиВНаименованииПараметра(НаименованиеПараметра) Тогда
		Сообщение = Новый СообщениеПользователю;
		Сообщение.Текст = "Введите наименование параметра";
		Сообщение.Поле = "НаименованиеПараметра";
		Сообщение.Сообщить();
	Иначе
		Если Параметры.Переименовать Тогда
			ПереименоватьПараметр(Параметры.ИмяПараметра, НаименованиеПараметра);
			Оповестить("ИзменилсяПараметр");
			Закрыть();
		Иначе
			ЭтаФорма.Заголовок= "Новый параметр : " + НаименованиеПараметра;
			УправлениеВидимостьюЭлементовФормы("ВыбраныйТип", Ложь);
		КонецЕсли;
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Функция ЕстьОшибкиВНаименованииПараметра(Имя)
	Если ПустаяСтрока(Имя) Тогда
		Возврат Истина;
	Иначе
		 //TODO  проверка на допустимые символы
		Возврат Ложь;
	КонецЕсли;
КонецФункции

&НаКлиенте
Процедура ВыбраныйТипПриИзменении(Элемент)
	Параметры.ТипПараметра=ВыбраныйТип;
	УправлениеВидимостьюЭлементовФормы(ВыбраныйТип);
КонецПроцедуры

&НаКлиенте
Процедура ВнешнийФайлНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	СтандартнаяОбработка=Ложь;
	Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
	Диалог.Заголовок = "Выберите файл";
	Диалог.ПолноеИмяФайла = "";
	Фильтр = "Все файлы  (*.*)|*.*";
	Диалог.Фильтр = Фильтр;
	Диалог.МножественныйВыбор = Ложь;
	Диалог.Показать(Новый ОписаниеОповещения("ВнешнийФайлНачалоВыбораЗавершение", ЭтаФорма));
КонецПроцедуры

&НаКлиенте
Процедура ВнешнийФайлНачалоВыбораЗавершение(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт
	Если (ТипЗнч(ВыбранныеФайлы) = Тип("Массив") И ВыбранныеФайлы.Количество() > 0) Тогда
		ВнешнийФайл = ВыбранныеФайлы[0];
		ОписаниеОповещения = Новый ОписаниеОповещения("ЗакончитьПомещениеФайла", ЭтотОбъект);
		НачатьПомещениеФайла(ОписаниеОповещения, , ВнешнийФайл, Ложь, ЭтаФорма.УникальныйИдентификатор);
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ЗакончитьПомещениеФайла(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт
	АдресХранилища = Адрес;
КонецПроцедуры

&НаСервере
Процедура УправлениеВидимостьюЭлементовФормы(П = "", ВидимостьКнопок = Истина)
	Для Каждого Эл Из Элементы Цикл
		Если ТипЗнч(Эл) = Тип("ДекорацияФормы") Тогда
			Продолжить;
		КонецЕсли;
		Если Не ПустаяСтрока(П) Тогда
			Эл.Видимость=?(Найти(Эл.Имя, П) > 0, Истина, Ложь);
		КонецЕсли;
		Если Найти(Эл.Имя, "Закрыть") > 0 Тогда
			Эл.Видимость=ВидимостьКнопок;
			Эл.Родитель.Видимость=Истина;
		КонецЕсли;
	КонецЦикла;
КонецПроцедуры

&НаСервере
Процедура УправлениеВидимостьюКоллекции(П = "Массив")
	Если Не ПустаяСтрока(Параметры.ИмяПараметра) Тогда
		Элементы.ТипКоллекция.Видимость=Ложь;
	КонецЕсли;
	Если П = "Массив" Тогда
		УИ_РаботаСФормами.ДобавитьКолонкуНС(ЭтотОбъект, "Значение", ОписаниеТипа, "ПараметрКоллекция");
	ИначеЕсли П = "Структура" Тогда
		Элементы.ОписаниеТипа.Видимость=Ложь;
		Элементы.ДобавитьКолонку.Видимость=Ложь;
		ОТ= Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(20, ДопустимаяДлина.Переменная));
		УИ_РаботаСФормами.ДобавитьКолонкуНС(ЭтотОбъект, "Ключ", ОТ, "ПараметрКоллекция");
		УИ_РаботаСФормами.ДобавитьКолонкуНС(ЭтотОбъект, "Значение", ОписаниеТипа, "ПараметрКоллекция");
	ИначеЕсли П = "Соответствие" Тогда
		Элементы.ОписаниеТипа.Видимость=Ложь;
		Элементы.ДобавитьКолонку.Видимость=Ложь;
		УИ_РаботаСФормами.ДобавитьКолонкуНС(ЭтотОбъект, "Ключ", ОписаниеТипа, "ПараметрКоллекция");
		УИ_РаботаСФормами.ДобавитьКолонкуНС(ЭтотОбъект, "Значение", ОписаниеТипа, "ПараметрКоллекция");
	Иначе
		Элементы.ОписаниеТипа.Видимость=Истина;
		Элементы.ДобавитьКолонку.Видимость=Истина;
		Элементы.УдалитьКолонку.Видимость=Истина;
	КонецЕсли;
КонецПроцедуры

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	Если ПустаяСтрока(Параметры.ИмяПараметра) Тогда
		ЭтаФорма.Заголовок="Новый параметр";
		УправлениеВидимостьюЭлементовФормы("Наименование", Ложь);
	ИначеЕсли Параметры.Переименовать Тогда
		ЭтаФорма.Заголовок=Параметры.ИмяПараметра + ":Новое имя параметра";
		НаименованиеПараметра=Параметры.ИмяПараметра;
		УправлениеВидимостьюЭлементовФормы("Наименование");
	Иначе
		НаименованиеПараметра=Параметры.ИмяПараметра;
		ЭтаФорма.Заголовок=Параметры.ИмяПараметра + ":Изменение параметра";
		ДействияПриИзменениеПараметра();
	КонецЕсли;
КонецПроцедуры

&НаСервере
Процедура ДействияПриИзменениеПараметра()
	Параметр=ПолучитьПараметр(Параметры.ИмяПараметра);
	C = Новый Соответствие;
	C.Вставить("Массив", "Коллекция");
	C.Вставить("Структура", "Коллекция");
	C.Вставить("Соответствие", "Коллекция");
	C.Вставить("Таблица значений", "Коллекция");
	C.Вставить("Двоичные данные", "ВнешнийФайл");
	C.Вставить(Неопределено, "ДоступныеТипы");
	ТипПараметра=C.Получить(Параметры.ТипПараметра);
	Если ТипПараметра = Неопределено Тогда
		УправлениеВидимостьюЭлементовФормы("ДоступныеТипы");
		ДоступныеТипы=Параметр;
		Элементы.ДоступныеТипы.Заголовок=Параметры.ТипПараметра;
		Элементы.ДоступныеТипы.ВыбиратьТип=Ложь;
		Параметры.ТипПараметра="ДоступныеТипы";
	ИначеЕсли ТипПараметра = "Коллекция" Тогда
		УправлениеВидимостьюЭлементовФормы("Коллекция");
		Элементы.ТипКоллекция.Видимость=Ложь;
		Для Каждого ЭлементКоллекции Из Элементы.ПараметрКоллекция.ПодчиненныеЭлементы Цикл
			ЭлементКоллекции.Видимость=Истина;
		КонецЦикла;
		Если Параметры.ТипПараметра = "Массив" Тогда
			УИ_РаботаСФормами.ДобавитьКолонкуНС(ЭтотОбъект, "Значение", ОписаниеТипа, "ПараметрКоллекция");
			Т = УИ_ОбщегоНазначения.КоллекцияВТЗ(Параметр);
			ПараметрКоллекция.Загрузить(Т);
			ТипКоллекция="Массив";
		ИначеЕсли Параметры.ТипПараметра = "Структура" Тогда
			Элементы.ОписаниеТипа.Видимость=Ложь;
			Элементы.ДобавитьКолонку.Видимость=Ложь;
			ОТ = Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(20, ДопустимаяДлина.Переменная));
			УИ_РаботаСФормами.ДобавитьКолонкуНС(ЭтотОбъект, "Ключ", ОТ, "ПараметрКоллекция");
			УИ_РаботаСФормами.ДобавитьКолонкуНС(ЭтотОбъект, "Значение", ОписаниеТипа, "ПараметрКоллекция");
			Т = УИ_ОбщегоНазначения.КоллекцияВТЗ(Параметр);
			ПараметрКоллекция.Загрузить(Т);
			ТипКоллекция="Структура";
		ИначеЕсли Параметры.ТипПараметра = "Соответствие" Тогда
			Элементы.ОписаниеТипа.Видимость=Ложь;
			Элементы.ДобавитьКолонку.Видимость=Ложь;
			УИ_РаботаСФормами.ДобавитьКолонкуНС(ЭтотОбъект, "Ключ", ОписаниеТипа, "ПараметрКоллекция");
			УИ_РаботаСФормами.ДобавитьКолонкуНС(ЭтотОбъект, "Значение", ОписаниеТипа, "ПараметрКоллекция");
			Т = УИ_ОбщегоНазначения.КоллекцияВТЗ(Параметр);
			ПараметрКоллекция.Загрузить(Т);
			ТипКоллекция="Соответствие";
		Иначе
			Элементы.ОписаниеТипа.Видимость=Истина;
			Элементы.ДобавитьКолонку.Видимость=Истина;
			Элементы.УдалитьКолонку.Видимость=Истина;
			Для Каждого Колонка Из Параметр.Колонки Цикл
				УИ_РаботаСФормами.ДобавитьКолонкуНС(ЭтотОбъект, Колонка.Имя, Колонка.ТипЗначения, "ПараметрКоллекция");
			КонецЦикла;
			ПараметрКоллекция.Загрузить(Параметр);
		КонецЕсли;
	Иначе
		Параметры.ТипПараметра="ВнешнийФайл";
		УправлениеВидимостьюЭлементовФормы("ВнешнийФайл");
	КонецЕсли;
КонецПроцедуры

&НаСервере
Процедура ПереименоватьПараметр(Ключ, НовоеИмя)
	ВыбОбъект=РеквизитФормыВЗначение("Объект");
	ВыбОбъект.ПереименоватьПараметр(Ключ, НовоеИмя);
КонецПроцедуры

/// Интерф

&НаКлиенте
Процедура ДобавитьКолонку(Команда)
	КолонкаИмя="";
	ПоказатьВводЗначения(Новый ОписаниеОповещения("ДобавитьКолонкуЗавершение", ЭтаФорма, Новый Структура("КолонкаИмя",
		КолонкаИмя)), КолонкаИмя, "Введите имя новой колонки", "Строка");
КонецПроцедуры

&НаКлиенте
Процедура ДобавитьКолонкуЗавершение(Значение, ДополнительныеПараметры) Экспорт

	КолонкаИмя = ?(Значение = Неопределено, ДополнительныеПараметры.КолонкаИмя, Значение);
	Если Не ПустаяСтрока(КолонкаИмя) Тогда
		ДобавитьКолонкуНСНаСервере(СокрЛП(КолонкаИмя), ОписаниеТипа, "ПараметрКоллекция");
		ОписаниеТипа="";
	Иначе
		Возврат;
	КонецЕсли;

КонецПроцедуры

&НаСервере
Процедура ДобавитьКолонкуНСНаСервере(КолонкаИмя, ОписаниеТипа, ИмяТаблицы)
	УИ_РаботаСФормами.ДобавитьКолонкуНС(ЭтотОбъект, КолонкаИмя, ОписаниеТипа, ИмяТаблицы);
КонецПроцедуры

&НаСервере
Процедура УдалитьКолонкуНСНаСервере(КолонкаИмя, ИмяТаблицы)
	УИ_РаботаСФормами.УдалитьКолонкуНС(ЭтотОбъект, КолонкаИмя, ИмяТаблицы);
КонецПроцедуры

&НаКлиенте
Процедура УдалитьКолонку(Команда)
	ИмяКолонки=Элементы.ПараметрКоллекция.ТекущийЭлемент.Имя;
	Если Элементы.ПараметрКоллекция.ТекущийЭлемент <> Неопределено Тогда
		ПоказатьВопрос(Новый ОписаниеОповещения("УдалитьКолонкуЗавершение", ЭтаФорма, Новый Структура("ИмяКолонки",
			ИмяКолонки)), "Вы уверены что хотите изменить удалить колонку  """ + ИмяКолонки + """ ?",
			РежимДиалогаВопрос.ДаНет);
	Иначе
		ПоказатьПредупреждение(Неопределено, "Нужно выбрать колонку таблицы !");
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура УдалитьКолонкуЗавершение(РезультатВопроса, ДополнительныеПараметры) Экспорт

	ИмяКолонки = ДополнительныеПараметры.ИмяКолонки;

	Если РезультатВопроса = КодВозвратаДиалога.Да Тогда
		УдалитьКолонкуНСНаСервере(ИмяКолонки, "ПараметрКоллекция");
	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура ТипКоллекцияПриИзменении(Элемент)
	УправлениеВидимостьюКоллекции(ТипКоллекция);
	Элемент.Видимость=Ложь;
КонецПроцедуры

&НаСервере
Процедура ИзменитьПараметр()
	НовоеЗначение=ПолучитьНовоеЗначение();
	Если Не НовоеЗначение = Неопределено Тогда
		ВыбОбъект=РеквизитФормыВЗначение("Объект");
		ВыбОбъект.ИзменитьПараметр(НаименованиеПараметра, НовоеЗначение);
	КонецЕсли;
КонецПроцедуры

&НаСервере
Функция ПолучитьНовоеЗначение()
	Если Параметры.ТипПараметра = "ДоступныеТипы" Тогда
		Возврат ДоступныеТипы;
	ИначеЕсли Параметры.ТипПараметра = "ВнешнийФайл" Тогда
		Поз = СтрНайти(ВнешнийФайл, ".", НаправлениеПоиска.СКонца);
		Возврат "{" + ?(Поз > 0, Сред(ВнешнийФайл, Поз + 1) + "}", "}") + АдресХранилища;
	ИначеЕсли Параметры.ТипПараметра = "ОпределяемыйТип" Тогда
		Попытка
			Результат=Неопределено;
			Выполнить (ОпределяемыйТип);
			Возврат Результат;
		Исключение
			Сообщить(ОписаниеОшибки());
			Возврат Неопределено;
		КонецПопытки;
	Иначе
		Т=РеквизитФормыВЗначение("ПараметрКоллекция");
		Если ТипКоллекция = "Массив" Тогда
			Возврат Т.ВыгрузитьКолонку(0);
		ИначеЕсли ТипКоллекция = "Структура" Тогда
			С=Новый Структура;
			Для Каждого Стр Из Т Цикл
				С.Вставить(Стр.Ключ, Стр.Значение);КонецЦикла
			;
			Возврат С;
		ИначеЕсли ТипКоллекция = "Соответствие" Тогда
			С=Новый Соответствие;
			Для Каждого Стр Из Т Цикл
				С.Вставить(Стр.Ключ, Стр.Значение);КонецЦикла
			;
			Возврат С;
		Иначе
			Возврат Т;
		КонецЕсли;
	КонецЕсли;
КонецФункции

&НаСервере
Функция ПолучитьПараметр(НаименованиеПараметра)
	ВыбОбъект=РеквизитФормыВЗначение("Объект");
	Возврат ВыбОбъект.ПолучитьПараметр(НаименованиеПараметра);
КонецФункции // ПолучитьПараметр()

&НаКлиенте
Процедура НаименованиеПараметраПриИзменении(Элемент)
	Если Не Параметры.Переименовать Тогда
		Параметры.ИмяПараметра=СокрЛП(НаименованиеПараметра);
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ДоступныеТипыПриИзменении(Элемент)
	Элемент.Заголовок=ТипЗнч(ДоступныеТипы);
КонецПроцедуры

&НаКлиенте
Процедура ОпределяемыйТипОкончаниеВводаТекста(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных,
	СтандартнаяОбработка)
	Параметры.ТипПараметра="ОпределяемыйТип";
КонецПроцедуры